// 一. 导入express
const express = require('express')

// 导入数据库操作的方法
const { getAll, getById, exec } = require('../db')
const { debug } = require('../config')

// 二. 实例化router对象
const router = express.Router()
// 三. 编写路由规则
/**
 * 获取所有待办
 * GET /todos
 */
router.get('/', async (req, res) => {
  // 操作数据库
  let sql = `select id, content, updated_time from xzd_todos where deleted_time is null`

  try {
    // 需要测试的代码
    const data = await getAll(sql)
    res.send({
      code: 0,
      message: '获取所有待办成功',
      result: data,
    })
  } catch (err) {
    // 处理异常情况(错误处理)
    res.send({
      code: 100101, // 10: 第一个版; 01: todos模块; 01: 错误
      message: '获取所有待办失败',
      result: debug ? err : '',
    })
  }
})

/**
 * 根据id获取todo
 * GET /todos/:id
 */
router.get('/:id', async (req, res) => {
  console.log(req.params)
  // 一. 解析请求数据(id)
  const { id } = req.params

  // 对请求的参数格式进行校验
  const reg = /^\d+$/

  if (!reg.test(id)) {
    res.send({
      code: 100104,
      message: 'id必须为数字',
      result: '',
    })
    return
  }

  // 二. 操作数据库
  let sql = `select id, content, updated_time from xzd_todos where id=${id} and deleted_time is null`
  console.log(sql)
  // 三. 返回结果
  try {
    var data = await getById(sql)
  } catch (err) {
    res.send({
      code: 100102,
      message: '查询单个待办失败',
      result: debug ? err : '',
    })
  }

  // 判断...
  if (data) {
    // 成功
    res.send({
      code: 0,
      message: '查询单个待办成功',
      result: data,
    })
  } else {
    // 根据id没有查询到结果
    res.status(404).send({
      code: 100103,
      message: 'id对应的数据不存在',
      result: '',
    })
  }
})

/**
 * 新增todo
 * POST /todos {content: 'todo-test'}
 */
router.post('/', async (req, res) => {
  // 一. 解析请求数据(body)
  const { content } = req.body
  // console.log(content)
  // 请求参数的校验, 不能为空
  if (!content) {
    // 出错!! content == undefined
    res.send({
      code: 100105,
      message: 'content格式错误',
      result: '',
    })
    return
  }

  // 二. 操作数据库
  let sql = `insert into xzd_todos (content) values ('${content}')`
  try {
    var { insertId } = await exec(sql)
  } catch (err) {
    res.send({
      code: 100106,
      message: '添加待办失败',
      result: debug ? err : '',
    })
    return
  }
  sql = `select id, content, updated_time from xzd_todos where id=${insertId}`
  try {
    const data = await getById(sql)
    // 三. 结果返回
    res.send({
      code: 0,
      message: '添加待办成功',
      result: data,
    })
  } catch (err) {
    res.send({
      code: 100106,
      message: '添加待办失败',
      result: debug ? err : '',
    })
  }
})

/**
 * 修改todo
 * PUT /todos/:id {content: 'todo-new'}
 */
router.put('/:id', async (req, res) => {
  // 一. 解析请求参数
  const { id } = req.params
  const { content } = req.body
  // todo: 参数的校验

  // 二. 操作数据库
  let sql = `update xzd_todos set content='${content}' where id=${id}`
  await exec(sql)

  res.send({
    code: 0,
    message: '更新待办成功',
    retsult: {
      id: id,
      content: content,
    },
  })
})

/**
 * 删除todo
 * DELETE /todos/:id
 */
router.delete('/:id', async (req, res) => {
  // 一. 解析请求数据
  const { id } = req.params
  // todo: 请求参数的校验

  // 二. 操作数据库
  let sql = `update xzd_todos set deleted_time = NOW() where id=${id}`
  await exec(sql)

  // 三. 返回结果
  res.send({
    code: 0,
    message: '删除成功',
    result: '',
  })
})

// 四. 导出router对象
module.exports = router
